#include "cal.h"   // 基类定义
#include <dlfcn.h> // 动态加载库的头文件
#include <iostream>

int main() {
  // 打开共享库
  void *handle = dlopen("./lib/libsum_fun.so", RTLD_LAZY);
  if (!handle) {
    std::cerr << "无法加载共享库: " << dlerror() << std::endl;
    return 1;
  }

  // 获取工厂函数
  using CreateAddsFunc = cal_fun *(*)();
  CreateAddsFunc create_adds = (CreateAddsFunc)dlsym(handle, "create_funs");
  if (!create_adds) {
    std::cerr << "无法获取工厂函数: " << dlerror() << std::endl;
    dlclose(handle);
    return 1;
  }

  // 创建 Adds 类的实例
  cal_fun *adds_instance = create_adds();
  if (!adds_instance) {
    std::cerr << "无法创建 Adds 实例" << std::endl;
    dlclose(handle);
    return 1;
  }

  // 使用实例
  double result = adds_instance->Calculate(5.0, 3.0);
  std::cout << "计算结果: " << result << std::endl;

  //   // 释放资源
  //   delete adds_instance;
  //   dlclose(handle);

  handle = dlopen("./lib/libmin_fun.so", RTLD_LAZY);
  if (!handle) {
    std::cerr << "无法加载共享库: " << dlerror() << std::endl;
    return 1;
  }

  // 获取工厂函数

  CreateAddsFunc create_minutes = (CreateAddsFunc)dlsym(handle, "create_funs");
  if (!create_minutes) {
    std::cerr << "无法获取工厂函数: " << dlerror() << std::endl;
    dlclose(handle);
    return 1;
  }

  // 创建 Adds 类的实例
  cal_fun *minute_instance = create_minutes();
  if (!minute_instance) {
    std::cerr << "无法创建 Adds 实例" << std::endl;
    dlclose(handle);
    return 1;
  }

  // 使用实例
  result = minute_instance->Calculate(5.0, 3.0);
  std::cout << "计算结果: " << result << std::endl;

  // 释放资源
  delete adds_instance;
  delete minute_instance;
  dlclose(handle);

  return 0;
}